package com.numberone.iotplatform.controller;

import com.numberone.iotplatform.dto.LocationDTO;
import com.numberone.iotplatform.dto.LocationMoveDTO;
import com.numberone.iotplatform.service.LocationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
 * 设备安装位置管理的RESTful API控制器
 */
@RestController
@RequestMapping("/locations")
@PreAuthorize("hasRole('ADMIN')") // 统一要求 ADMIN 角色权限
public class LocationController {

    @Autowired
    private LocationService locationService;

    /**
     * GET /api/locations/tree
     * 获取位置树。
     * @param name (可选) 按名称过滤，返回扁平列表
     * @return 位置树列表 DTO
     */
    @GetMapping("/tree")
    @PreAuthorize("hasRole('ADMIN') or hasRole('OPERATOR')") // 放宽权限，让操作员也能查看
    public ResponseEntity<List<LocationDTO>> getLocationTree(@RequestParam(required = false) String name) {
        List<LocationDTO> locationTree = locationService.getLocationTree(name);
        return ResponseEntity.ok(locationTree);
    }

    /**
     * POST /api/locations
     * 创建一个新位置。
     * @param locationDTO 包含 name, parentId, description
     * @return 创建后的位置 DTO
     */
    @PostMapping
    public ResponseEntity<LocationDTO> createLocation(@Valid @RequestBody LocationDTO locationDTO) {
        LocationDTO createdLocation = locationService.createLocation(locationDTO);
        return ResponseEntity.ok(createdLocation);
    }

    /**
     * PUT /api/locations/{id}
     * 更新指定位置的信息。
     * @param id 要更新的位置ID
     * @param locationDTO 包含要更新的 name 和 description
     * @return 更新后的位置 DTO
     */
    @PutMapping("/{id}")
    public ResponseEntity<LocationDTO> updateLocation(@PathVariable Long id, @Valid @RequestBody LocationDTO locationDTO) {
        LocationDTO updatedLocation = locationService.updateLocation(id, locationDTO);
        return ResponseEntity.ok(updatedLocation);
    }

    /**
     * DELETE /api/locations/{id}
     * 删除指定位置。
     * @param id 要删除的位置ID
     * @return 200 OK
     */
    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteLocation(@PathVariable Long id) {
        locationService.deleteLocation(id);
        return ResponseEntity.ok().build();
    }

    /**
     * POST /api/locations/move
     * 移动一个位置到新的父节点下。
     * @param moveDTO 包含 dragId (被移动的节点) 和 targetId (新的父节点)
     * @return 200 OK
     */
    @PostMapping("/move")
    public ResponseEntity<Void> moveLocation(@Valid @RequestBody LocationMoveDTO moveDTO) {
        // 【核心修正】调用 Service 中参数更明确的方法
        locationService.moveLocation(moveDTO.getDragId(), moveDTO.getTargetId());
        return ResponseEntity.ok().build();
    }

    /**
     * PUT /api/locations/sort
     * 更新同级节点列表的排序。
     * @param sortedLocationIds 按新顺序排列好的位置ID列表
     * @return 200 OK
     */
    @PutMapping("/sort")
    public ResponseEntity<Void> updateSortOrder(@RequestBody List<Long> sortedLocationIds) {
        // 【核心修正】接收一个 Long 类型的 ID 列表，而不是完整的 DTO 列表
        locationService.updateSortOrder(sortedLocationIds);
        return ResponseEntity.ok().build();
    }
}